using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Collections.Generic;

/// <summary>
/// Summary description for EmpleadosBD
/// </summary>
public class EmpleadosBD
{	
	//Constructor de Empleado
	public EmpleadosBD()
	{
		//
		// TODO: Add constructor logic here
		//
	}
	
	//Consulta de Empleados para cargar el grid, obtengo (cedula,nombre y departamento)
    public DataTable ConsultarEmpleados()
    {

        DataTable resultados = new DataTable();
        SqlDataAdapter adpEmpleados = new SqlDataAdapter();
		
		//utilizo conection string para conectarme
        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();
			//Declaracion del comando a ejecutar!
            SqlCommand cmd = new SqlCommand("Select cedula,nombre,departamento,puesto from Empleados");
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            adpEmpleados.SelectCommand = cmd;
            adpEmpleados.Fill(resultados);	//pido resultados de la consulta
        }

        return resultados;	//devuelvo los resultados como DataTable()
    }
	
	//funcion de consulta de los datos especificos de un empleado, devuelve la entidad empleado	
    public EmpleadosEnt ConsultarEmpleado(int cedula)
    {
        EmpleadosEnt resultado = null;

		//utilizo conection string para conectarme
        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();
			//Declaracion del comando a ejecutar
            SqlCommand cmd =
                new SqlCommand("Select cedula, nombre, telefono, correo, departamento, puesto from Empleados where cedula = @cedula");
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.Add(new SqlParameter("@cedula", cedula)); //especificacion del parametro
																	//Para consultar
            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                resultado = this.ObtenerEmpleado(dr); //obtengo la entidad de empleado
            }
        }
        return resultado;
    }

	//leer tupla correspondiente al empleado
    private EmpleadosEnt ObtenerEmpleado(SqlDataReader dr)
    {
        EmpleadosEnt resultado = null;

        if (dr.HasRows)	
        {
            dr.Read();	//leo la tupla
			//obtengo los valores
            int colCedula = dr.GetOrdinal("Cedula");
            int colNombre = dr.GetOrdinal("Nombre");
            int colTelefono = dr.GetOrdinal("Telefono");
            int colCorreo = dr.GetOrdinal("Correo");
            int colDepartamento = dr.GetOrdinal("Departamento");
            int colPuesto = dr.GetOrdinal("Puesto");

            object[] valores = new object[dr.FieldCount];
            dr.GetValues(valores);
			
			//casteo los valores al tipo correspondiente
            int cedula = (int)valores[colCedula];
            string nombre = (string)valores[colNombre];
            int telefono = (int)valores[colTelefono];
            string correo = (string)valores[colCorreo];
            string departamento = (string)valores[colDepartamento];
            string puesto = (string)valores[colPuesto];
			
			//Creo la entidad de empleado con los parametros correspondientes
            resultado = new EmpleadosEnt(cedula,nombre,telefono,correo,departamento,puesto);
        }
        return resultado; //devuelvo la entidad
    }
	
	//Metodo de insercion del empleado en la base de datos
    public bool InsertarEmpleado(EmpleadosEnt Empleado)
    {
        bool resultado = true;
        try
        {	//me conecto a traves de connection string
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();
				//Declaro el comando de insercion a ejecutar
                SqlCommand cmd = new SqlCommand("Insert Empleados(cedula,nombre,telefono,correo,departamento,puesto) values(@cedula,@nombre,@telefono,@correo,@departamento,@puesto)");
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
				//agrego todos los parametro correspondientes a datos del empleado
                cmd.Parameters.Add(new SqlParameter("@cedula", Empleado.Cedula));
                cmd.Parameters.Add(new SqlParameter("@nombre", Empleado.Nombre));
                cmd.Parameters.Add(new SqlParameter("@telefono", Empleado.Telefono));
                cmd.Parameters.Add(new SqlParameter("@correo", Empleado.Correo));
                cmd.Parameters.Add(new SqlParameter("@departamento", Empleado.Departamento));
                cmd.Parameters.Add(new SqlParameter("@puesto", Empleado.Puesto));
                cmd.ExecuteNonQuery();
            }

        }
        catch	//si no se pudo conectar  o hubo un error devuelve falso en el insertar
        {
            resultado = false;
        }

        return resultado;
    }
	
	//elimina al empleado de la base de datos, recibe la cedula del empleado
    public bool EliminarEmpleado(int id, int cedula)
    {	
        bool resultado = true;
        try
        {	//me conecto utilizando la conection string establecida
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();
				//Declaracion del comando de eliminacion
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = "EliminarEmpleado";
                cmd.Parameters.Add(new SqlParameter("@cedula", cedula));
                cmd.Parameters.Add(new SqlParameter("@id", id));
                cmd.ExecuteNonQuery();
            }

        }
        catch
        {
            resultado = false; //devuelva falso si no se logra conectar o hubo un error
        }

        return resultado;
    }
	
	//Metodo de actualizacion de los datos de un empleado
    public bool ActualizarEmpleado(EmpleadosEnt Empleado, int cedulaVieja)
    {
        bool resultado = true;
        try
        {	//me conecto utilizando la conection string establecida
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();
				
				//Declaracion del comando de modificacion
                SqlCommand cmd = 
                    new SqlCommand("Update Empleados set cedula = @cedula, nombre = @nombre, telefono = @telefono, correo = @correo, departamento = @departamento, puesto = @puesto where cedula = @cedulaVieja");
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
				//agrego los parametros a la consulta
                cmd.Parameters.Add(new SqlParameter("@cedulaVieja", cedulaVieja));
                cmd.Parameters.Add(new SqlParameter("@cedula", Empleado.Cedula));
                cmd.Parameters.Add(new SqlParameter("@nombre", Empleado.Nombre));
                cmd.Parameters.Add(new SqlParameter("@telefono", Empleado.Telefono));
                cmd.Parameters.Add(new SqlParameter("@correo", Empleado.Correo));
                cmd.Parameters.Add(new SqlParameter("@departamento", Empleado.Departamento));
                cmd.Parameters.Add(new SqlParameter("@puesto", Empleado.Puesto));
                cmd.ExecuteNonQuery();
            }

        }
        catch
        {
            resultado = false; //devuelvo falso si no se logro conectar o hubo un error
        }

        return resultado;
    }

    public DataTable ConsultarEmpleadosSinCuenta()
    {
        DataTable resultados = new DataTable();
        SqlDataAdapter adpEmpleados = new SqlDataAdapter();

        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();

            SqlCommand cmd = new SqlCommand("Select nombre from Empleados where cedula not in (select cedulaEmp from cuentas)");
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            adpEmpleados.SelectCommand = cmd;
            adpEmpleados.Fill(resultados);
        }
        return resultados;
    }
//**************************************Para PROYECTO********************************************************

    public List<EmpleadosEnt> ConsultarEmpleadosAsignados(int id)
    {
        List<EmpleadosEnt> resultados = new List<EmpleadosEnt>();
                                                                                                                                                                                                                                                    

        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();

            SqlCommand cmd = new SqlCommand("Select cedula, nombre from Empleados join EmpPro on empleado = cedula where ProyectoId = @id");
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.Add(new SqlParameter("@id", id));
            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                resultados = this.ObtenerEmpleadosProyecto(dr);
            }
        }
        return resultados;
    }

    public List<EmpleadosEnt> ConsultarEmpleadosDisponibles(int id)
    {
        List<EmpleadosEnt> resultados = new List<EmpleadosEnt>();
        string consulta = "Select Distinct (cedula), nombre from Empleados e join Cuentas c on (e.cedula = c.CedulaEmp and c.Perfil = 'Desarrollador')";
        consulta += "EXCEPT (Select Distinct (e2.cedula), e2.Nombre from Empleados e2 join EmpPro ep2 on ep2.empleado = e2.cedula and ep2.ProyectoId = @id )";


        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();

            SqlCommand cmd = new SqlCommand(consulta);
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.Add(new SqlParameter("@id", id));
            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                resultados = this.ObtenerEmpleadosProyecto(dr);
            }
        }
        return resultados;
    }

    public List<EmpleadosEnt> ConsultarEmpleadosDisponibles()
    {
        List<EmpleadosEnt> resultados = new List<EmpleadosEnt>();
        string consulta = "SELECT e.nombre, e.Cedula from Empleados e, Cuentas c ";
        consulta += "where e.cedula = c.CedulaEmp and c.Perfil = 'Desarrollador'";

        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();

            SqlCommand cmd = new SqlCommand(consulta);
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
         
            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                resultados = this.ObtenerEmpleadosProyecto(dr);
            }
        }
        return resultados;
    }

    public List<EmpleadosEnt> ConsultarEmpleadosLideres()
    {
        List<EmpleadosEnt> resultados = new List<EmpleadosEnt>();
        string consulta = "SELECT e.nombre, e.Cedula from Empleados e, Cuentas c ";
        consulta += "where e.cedula = c.CedulaEmp and c.Perfil = 'lider'";

        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();

            SqlCommand cmd = new SqlCommand(consulta);
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            
            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                resultados = this.ObtenerEmpleadosProyecto(dr);
            }
        }
        return resultados;
    }

    public List<EmpleadosEnt> ObtenerEmpleadosProyecto(SqlDataReader dr)
    {
        List<EmpleadosEnt> resultados = new List<EmpleadosEnt>();

        int colCedula = dr.GetOrdinal("Cedula");
        int colNombre = dr.GetOrdinal("Nombre");
      
        object[] valores = new object[dr.FieldCount];

        while (dr.Read())
        {
            dr.GetValues(valores);

            int cedula = (int)valores[colCedula];
            string nombre = (string)valores[colNombre];

            resultados.Add(new EmpleadosEnt(cedula, nombre));
        }

        return resultados;
    }

    public bool ModificarRecursosHumanos(int id, List<EmpleadosEnt>asignados)
    {
       bool resultado = true;
       int listSize = asignados.Count;
       EliminarEmpleadosAsignados(id);
       try
        {
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();

                for (int i = 0; i < listSize; i++)
                {
                    SqlCommand cmd = new SqlCommand("Insert EmpPro(ProyectoId,Empleado) values(@ProyectoId,@empleado)");
                    cmd.Connection = cnn;
                    cmd.CommandType = CommandType.Text;
                    //agrego los parametros a la consulta
                    cmd.Parameters.Add(new SqlParameter("@empleado", asignados[i].Cedula));
                    cmd.Parameters.Add(new SqlParameter("@ProyectoId",id));
                    cmd.ExecuteNonQuery();
                }    
            }

    }
    catch
    {
        resultado = false; 
    }
        return resultado; 
    }

    private bool EliminarEmpleadosAsignados(int id)
    {
        bool resultado = true;

        try
        {
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();

                SqlCommand cmd = new SqlCommand("Delete from EmpPro where empleado = @id");
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.Add(new SqlParameter("@id", id));
                cmd.ExecuteNonQuery();
            }
        }
        catch
        {
            resultado = false;
        }
        return resultado;
    }

    public List<EmpleadosEnt> ObtenerEmpleados()
    {
        List<EmpleadosEnt> resultados = new List<EmpleadosEnt>();
     

        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();

            SqlCommand cmd = new SqlCommand("Select cedula, nombre from empleados");
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            cmd.ExecuteNonQuery();
            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                resultados = this.ObtenerEmpleadosProyecto(dr);
            }
        }

        return resultados;

    }
}
